import React from 'react';
import { Router } from 'dva/router';

import Category from "./routes/Category.js";

const cached = {};
function registerModel(app, model) {
  if (!cached[model.namespace]) {
    app.model(model);
    cached[model.namespace] = 1;
  }
}

/**
 * lz: 说明: require.ensure在需要的时候才下载依赖的模块，当参数指定的模块都下载下来了（下载下来的模块还没执行），便执行参数指定的回调函数。require.ensure会创建一个chunk，且可以指定该chunk的名称，如果这个chunk名已经存在了，则将本次依赖的模块合并到已经存在的chunk中，最后这个chunk在webpack构建的时候会单独生成一个文件。
 *     语法: require.ensure(dependencies: String[], callback: function([require]), [chunkName: String])
 *           dependencies: 依赖的模块数组
 *           callback: 回调函数，该函数调用时会传一个require参数
 *           chunkName: 模块名，用于构建时生成文件名
 *      注意点：requi.ensure的模块只会被下载下来，不会被执行，只有在回调函数使用require(模块名)后，这个模块才会被执行。
 */
function RouterConfig({ history, app }) {
  const routes = [
    {
      path: '/',
      name: 'IndexPage',
      getComponent(nextState, cb) {
        require.ensure([], (require) => {
          cb(null, require('./routes/IndexPage'));
        });
      },
    },
    {
      path: '/category',
      name: 'CategoryPage',
      getComponent(nextState, cb) {
        require.ensure([], (require) => {
          cb(null, require('./routes/Category'));
        });
      },
    },
    {
      path: '/users', //lz: 将要匹配的路由
      name: 'UsersPage',  //lz: 描述名称,可自由定义
      getComponent(nextState, cb) { //lz: getComponent() :该方法是异步的，也就是当路由匹配时，才会调用这个方法。: (表示跳转后的location 信息 ,回调函数)
        require.ensure([], (require) => { //lz: require.ensure(dependencies, callback, chunkName) :webpack 提供的按需加载方法。第一个参数是依赖，第二个是回调函数，第三个就是用来指定这个 chunk file 的 name。
          registerModel(app, require('./models/users'));  //lz: 注册model
          cb(null, require('./routes/Users'));
        });
      },
    },
  ];

  return <Router history={history} routes={routes} />; //lz: history 不变，在 <Router /> 中添加 routes 属性，将创建的路由传递进去。
}

export default RouterConfig;
